// 练习1 使用fp.add(x,y)和fp.map(f,x)创建一个能让 functor 里的值增加的函数 ex1
const fp = require('lodash/fp')
const { MayBe, Container } = require('./support')
let maybe = MayBe.of([5, 6, 1])
// 需求？？
// [5, 6, 1] => [5, 6, 1, 2]
// [5, 6, 1] => [6, 7, 2]
let ex1 = x => {
    // 你需要实现的函数
    // maybe为以及实例化的 MayBe 对象 将值的增加的方法在 maybe.map(fn) 传入此时会将 新的fn存放到 _value 中
    let fn = fp.map(fp.add(x))
    let addDefaultValue = maybe.map(fn)
    return addDefaultValue._value
}
console.log(ex1(1))

// 练习2 实现一个函数 ex2，能够使用fp.first 获取列表的第一个元素
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => {
    // 你需要实现的函数 xs为以及实例化的 Container 对象 获取列表的第一个元素d的方法在 Container.map(fn) 传入此时会将 新的fn存放到 _value 中
    let getFirstItem = xs.map(fp.first)
    return getFirstItem._value
}
console.log(ex2())

// 练习3 实现一个函数 ex3，使用safeProp和fp.first 找到user的名字的首字母
let safeProp = fp.curry(function (x, o) {
    return MayBe.of(o[x])
})
let user = {id: 2, name: 'Albert'}
let ex3 = () => {
    // 需要实现的函数 思路 safeProp 是一个柯里化函数，可用来初始化 函子的值 
    // 题目要求的是 user的名字的首字母 故传入 name 属性，即user属性 初始化函子的值为 MayBe { _value: 'Albert' }
    // 再将fp.first方法传入可以得到获取名字首字母的函子，最后执行 函子._value即可得到首字母
    return safeProp('name')(user).map(fp.first)._value
}
console.log(ex3())

// 练习4 使用 MayBe 重写 ex4 ，不要有if语句
let ex4 = function (n) {
    if (n) {
        return parseInt(n)
    }
}

// 思路 将 当n 的判断为真时 n 转换为 maybe函子的初始值，parseInt通过map传入 返回一个新的函子，最终通过 函子._value 得到想要的结果
let newEx4 = n => {
    return n && MayBe.of(n).map(parseInt)._value
}